da0070
@@ -69,6 +69,7 @@
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBaseCompare;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFCase;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDFNvl;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPAnd;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPEqual;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPEqualOrGreaterThan;
@@ -726,8 +727,18 @@
private static ExprNodeDesc shortcutFunction(GenericUDF udf, List<ExprNodeDesc>
         } else if(thenVal.equals(elseVal)){
           return thenExpr;
         } else if (thenVal instanceof Boolean && elseVal instanceof Boolean) {
-          return Boolean.TRUE.equals(thenVal) ? whenExpr :
-            ExprNodeGenericFuncDesc.newInstance(new GenericUDFOPNot(), newExprs.subList(0, 1));
+          List<ExprNodeDesc> children = new ArrayList<>();
+          children.add(whenExpr);
+          children.add(new ExprNodeConstantDesc(false));
+          ExprNodeGenericFuncDesc func = ExprNodeGenericFuncDesc.newInstance(new GenericUDFNvl(),
+              children);
+          if (Boolean.TRUE.equals(thenVal)) {
+            return func;
+          } else {
+            List<ExprNodeDesc> exprs = new ArrayList<>();
+            exprs.add(func);
+            return ExprNodeGenericFuncDesc.newInstance(new GenericUDFOPNot(), exprs);
+          }
         } else {
           return null;
         }
@@ -767,8 +778,20 @@
private static ExprNodeDesc shortcutFunction(GenericUDF udf, List<ExprNodeDesc>
         } else if(thenVal.equals(elseVal)){
           return thenExpr;
         } else if (thenVal instanceof Boolean && elseVal instanceof Boolean) {
-          return Boolean.TRUE.equals(thenVal) ? ExprNodeGenericFuncDesc.newInstance(new GenericUDFOPEqual(), newExprs.subList(0, 2)) :
-            ExprNodeGenericFuncDesc.newInstance(new GenericUDFOPNotEqual(), newExprs.subList(0, 2));
+          ExprNodeGenericFuncDesc equal = ExprNodeGenericFuncDesc.newInstance(
+              new GenericUDFOPEqual(), newExprs.subList(0, 2));
+          List<ExprNodeDesc> children = new ArrayList<>();
+          children.add(equal);
+          children.add(new ExprNodeConstantDesc(false));
+          ExprNodeGenericFuncDesc func = ExprNodeGenericFuncDesc.newInstance(new GenericUDFNvl(),
+              children);
+          if (Boolean.TRUE.equals(thenVal)) {
+            return func;
+          } else {
+            List<ExprNodeDesc> exprs = new ArrayList<>();
+            exprs.add(func);
+            return ExprNodeGenericFuncDesc.newInstance(new GenericUDFOPNot(), exprs);
+          }
         } else {
           return null;
         }
